/*
 * Copyright (c) 2010-2020 DMGIS Ltd. All Rights Reserved.
 *
 * This software is the confidential and proprietary information of
 * DMGIS. You shall not disclose such Confidential Information
 * and shall use it only in accordance with the terms of the agreements
 * you entered into with DMGIS.
 *
 */
package com.example.qxfw.dysjrh.utils;

import com.dmgis.util.DateTime;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * This class is used for 文件操作类
 *
 * @author dsq
 * @version 1.0, 2018年7月7日 下午4:03:35
 */
@Service
@RequiredArgsConstructor
public class FileUtil{

	/**
	 * 创建多级目录 mkdir创建一级目录 mkdirs创建多级目录
	 *
	 * @param dir_path
	 * @author dsq
	 * @date 2018年7月7日
	 */
	public void mkDirs(String dir_path) {
		File myFolderFile = new File(dir_path);
		try {
			if (!myFolderFile.exists()) {
				myFolderFile.mkdirs();
			}
		} catch (Exception e) {
			// TODO: 创建目录出错
			System.out.println(e.getStackTrace());
		}
	}


	/**
	 * 删除文件加下的所有文件
	 *
	 * @param file_path
	 * @author dsq
	 * @date 2018年7月7日
	 */
	public static void deleteFolder(String file_path) {
		try {
			File file = new File(file_path);
			if (!file.exists()) {
				return;
			}
			if (file.isFile()) {
				file.delete();
			} else {
				File[] files = file.listFiles();
				for (int i = 0; i < files.length; i++) {
					String root = files[i].getAbsolutePath();
					deleteFolder(root);
				}
				file.delete();
			}
		} catch (Exception e) {
			// TODO: 删除文件失败
			System.out.println(e.getStackTrace());
		}
	}
	/**
	 * 删除文件加下的所有文件
	 *
	 * @param file_path
	 * @author dsq
	 * @date 2018年7月7日
	 */
	public void deleteFolder(String file_path,DateTime date) {
		try {
			File file = new File(file_path);
			if (!file.exists()) {
				return;
			}
			if (file.isFile()&&new DateTime(file.lastModified()).before(date)) {
				file.delete();
			} else {
				File[] files = file.listFiles();
				for (int i = 0; i < files.length; i++) {
					String root = files[i].getAbsolutePath();
					deleteFolder(root,date);
				}
				file.delete();//删除文件夹
			}
		} catch (Exception e) {
			// TODO: 删除文件失败
			System.out.println(e.getStackTrace());
		}
	}
	/**
	 * 得到一个文件夹下的所有文件
	 *
	 * @param fold_path
	 * @return
	 * @author dsq
	 * @date 2018年7月7日
	 */
	public List<String> getAllFileNameInFold(String fold_path) {
		List<String> file_paths = new ArrayList<String>();

		LinkedList<String> folderList = new LinkedList<String>();
		folderList.add(fold_path);
		while (folderList.size() > 0) {
			File file = new File(folderList.peekLast());
			folderList.removeLast();
			File[] files = file.listFiles();
			ArrayList<File> fileList = new ArrayList<File>();
			for (int i = 0; i < files.length; i++) {
				if (files[i].isDirectory()) {
					folderList.add(files[i].getPath());
				} else {
					fileList.add(files[i]);
				}
			}
			for (File f : fileList) {
				file_paths.add(f.getAbsoluteFile().getPath());
			}
		}
		return file_paths;
	}

	/**
	 * 清除临时文件夹中的内容
	 *
	 * @param floderPath
	 *            文件夹位置
	 * @param maxCache
	 *            数量
	 * @author dsq
	 * @date 2018年7月9日
	 */
	public void ClearTempFiles(String floderPath, int maxCache) {
		int count = getAllFileNameInFold(floderPath).size();
		if (count > maxCache) {
			deleteFolder(floderPath);
			mkDirs(floderPath);// 建立目录
		}
	}

	/**
	 * bytes转文件
	 * @param buffer
	 * @param filePath
	 * @author dsq
	 * @date 2018年8月16日
	 */
	public void bytesToFile(byte[] buffer, final String filePath) {

		File file = new File(filePath);

		OutputStream output = null;
		BufferedOutputStream bufferedOutput = null;

		try {
			output = new FileOutputStream(file);

			bufferedOutput = new BufferedOutputStream(output);

			bufferedOutput.write(buffer);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != bufferedOutput) {
				try {
					bufferedOutput.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (null != output) {
				try {
					output.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}